<!DOCTYPE html>
<html>

  <head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

  <title>GcsSloop</title>
  <meta name="description" content="嗨，我是 GcsSloop，一名来自2.5次元的魔法师，Android自定义View系列文章作者，非著名程序员。">
  <meta name="author" content="GcsSloop">
  <meta name="keywords" content="">
  <meta name="关键字" content="">
  

  <meta name="twitter:card" content="summary">
  <meta name="twitter:title" content="GcsSloop">
  <meta name="twitter:description" content="嗨，我是 GcsSloop，一名来自2.5次元的魔法师，Android自定义View系列文章作者，非著名程序员。">
  <meta name="twitter:keywords" content="">
  
  <meta property="og:type" content="article">
  <meta property="og:title" content="GcsSloop">
  <meta property="og:description" content="嗨，我是 GcsSloop，一名来自2.5次元的魔法师，Android自定义View系列文章作者，非著名程序员。">
  <meta name="og:keywords" content="">

  <meta name="theme-color" content="#343434">
  
  <link rel="icon" type="image/png" href="https://raw.githubusercontent.com/GcsSloop/gcssloop.github.io/master/assets/siteinfo/favicon.png" />
  <link href="https://raw.githubusercontent.com/GcsSloop/gcssloop.github.io/master/assets/siteinfo/favicon.png" rel="shortcut icon" type="image/png">
  
  <link href="//netdna.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css" rel="stylesheet">
  <link rel="stylesheet" href="/css/main.css">

  <link rel="canonical" href="http://www.gcssloop.com/">
  <link rel="alternate" type="application/rss+xml" title="GcsSloop" href="http://www.gcssloop.com/feed.xml">
  
  <meta name="google-site-verification" content="Z_g58PkzRAyBMxkqrcDdWrTBK8oOWM-7rUHauhLNF2E" />
  <meta name="baidu-site-verification" content="kUtTXCKaZs" />
  <meta name="baidu-site-verification" content="6DuDv3aaJX" />
  
  <!--阅读次数统计-->
  <script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"> </script>
  
  <!--Fuck Weixin and Baidu-->
  <meta http-equiv="Cache-Control" content="no-transform">
  <meta http-equiv=”Cache-Control” content=”no-siteapp” />
  <meta name="applicable-device" content="pc,mobile">
  <meta name="HandheldFriendly" content="true"/>

  <!-- Google Ad -->
  <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
  <script>
    (adsbygoogle = window.adsbygoogle || []).push({
      google_ad_client: "ca-pub-2767831356529421",
      enable_page_level_ads: true
    });
  </script>

</head>


  <body>

    <span class="mobile btn-mobile-menu">
        <i class="fa fa-list btn-mobile-menu__icon"></i>
        <i class="fa fa-angle-up btn-mobile-close__icon hidden"></i>
    </span>
    
    <header class="panel-cover " style="background-image: url('/assets/siteinfo/background-cover.jpg')">
  <div class="panel-main">

    <div class="panel-main__inner panel-inverted">
    <div class="panel-main__content">

        <a href="/#blog" title="前往 GcsSloop 的主页" class="blog-button"><img src="/assets/siteinfo/avatar.jpg" width="80" alt="GcsSloop logo" class="panel-cover__logo logo" /></a>
        <h1 class="panel-cover__title panel-title"><a href="/#blog" title="link to homepage for GcsSloop" class="blog-button">GcsSloop</a></h1>

        
        <span class="panel-cover__subtitle panel-subtitle">Just do IT later.</span>
        
        <hr class="panel-cover__divider" />
        <p class="panel-cover__description">嗨，我是 GcsSloop，一名来自2.5次元的魔法师，Android自定义View系列文章作者，非著名程序员。</p>
        <hr class="panel-cover__divider panel-cover__divider--secondary" />
        
        
        <p class="panel-cover__description">欢迎来到我的魔法世界!</p>
        
        
        <div class="navigation-wrapper">
          <div>
            <nav class="cover-navigation cover-navigation--primary">
              <ul class="navigation">
                <li class="navigation__item"><a href="/#blog" title="访问博客" class="blog-button">博客</a></li>
                
                  
                    <li class="navigation__item"><a href="https://github.com/GcsSloop" target="_blank" title="GcsSloop's GitHub">GitHub</a></li>
                  
                  
                
                  
                    <li class="navigation__item"><a href="/timeline" title="博客目录">目录</a></li>
                  
                  
                
                  
                    <li class="navigation__item"><a href="https://xiaozhuanlan.com/u/GcsSloop" target="_blank" title="小专栏">专栏</a></li>
                  
                  
                
                  
                    <li class="navigation__item"><a href="/category/customview" title="自定义View教程目录">自定义控件</a></li>
                  
                  
                
                  
                    <li class="navigation__item"><a href="/friends" title="友链">友链</a></li>
                  
                  
                
              </ul>
            </nav>
          </div>
          
          <div><nav class="cover-navigation navigation--social">
  <ul class="navigation">

  
  <!-- Weibo -->
  <li class="navigation__item">
    <a href="http://weibo.com/GcsSloop" title="@GcsSloop 的微博" target="_blank">
      <i class='social fa fa-weibo'></i>
      <span class="label">Weibo</span>
    </a>
  </li>
  

  
  <!-- Github -->
  <li class="navigation__item">
    <a href="https://github.com/GcsSloop" title="@GcsSloop 的 Github" target="_blank">
      <i class='social fa fa-github'></i>
      <span class="label">Github</span>
    </a>
  </li>
  
  
  
  <!-- Twitter -->
  <li class="navigation__item">
    <a href="http://twitter.com/GcsSloop" title="@GcsSloop" target="_blank">
      <i class='social fa fa-twitter'></i>
      <span class="label">Twitter</span>
    </a>
  </li>
  

    

  

  
  <!-- RSS -->
  <li class="navigation__item">
    <a href="/feed.xml" rel="author" title="RSS" target="_blank">
      <i class='social fa fa-rss'></i>
      <span class="label">RSS</span>
    </a>
  </li>
  

  
  <!-- Email -->
  <li class="navigation__item">
    <a href="mailto:GcsSloop@gmail.com" title="发邮件给我">
      <i class='social fa fa-envelope'></i>
      <span class="label">Email</span>
    </a>
  </li>
  

  
  <!-- Copyright -->
  <li class="navigation__item">
    <a href="http://choosealicense.online" title="选择版权"  target="_blank">
      <i class="social fa fa-copyright"></i>
      <span class="label">版权</span>
    </a>
  </li>
  
  
  </ul>
</nav>
</div>
        </div>
      </div>
    </div>
    
    
    <div class="panel-cover--overlay cover-slate"></div>
    
  </div>
</header>


    <div class="content-wrapper">
        <div class="content-wrapper__inner">
            <div class="main-post-list hidden">

  <ol class="post-list">
    <!--目录-->
    
    <li>
      <h2 class="post-list__post-title post-title"><a href="/category/customview" title="访问 自定义View教程目录">[目录]Android自定义View教程</a></h2>
      <p class="excerpt"> <b>一个从零起步的自定义View教程。</b><br/>
      本教程从最基础的内容讲解，并且深入到了相关的各个细节，不论你是刚入门的菜鸟，还是有一定经验的工程师相信本系列文章都会对你有所帮助。
      你可以将本教程当作学习资料来学习自定义View相关的各种知识，也可以作为工具来使用，在需要的时候查询相关的一些知识细节。</p>
      <div class="post-list__meta"> 目录 &#8226; GcsSloop <a class="btn-border-small" href="/category/customview">继续阅读</a></div>
      <hr class="post-list__divider" />
    </li>
    <li>
      <h2 class="post-list__post-title post-title"><a href="/category/gebug" title="访问 自定义View教程目录">[目录]雕虫晓技</a></h2>
      <p class="excerpt"> <b>简单技术的深度挖掘，从简单中发现不简单</b><br/> 
      雕虫晓技这一系列文章的定位为杂谈，因此你会发现里面不仅有 Android 相关技术，还有一些乱七八糟的工具推荐，一些与开发相关的小技巧，同时也会包括一些个人杂谈等内容。</p>
      <div class="post-list__meta"> 目录 &#8226; GcsSloop <a class="btn-border-small" href="/category/gebug">继续阅读</a></div>
      <hr class="post-list__divider" />
    </li>
    
    <!--置顶-->
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
    <!--普通文档流-->
    
    
      <li>
          <!--正常文档-->
          
          <h2 class="post-list__post-title post-title"><a href="/customview/paint-base" title="访问 安卓自定义View进阶-画笔基础(Paint)">安卓自定义View进阶-画笔基础(Paint)</a></h2>
          <p class="excerpt">在Android自定义View系列文章中，前面的部分有详细的讲解画布(Canvas)的功能和用法，但是和画布(Canvas)共同出现的画笔(Paint)却没有详细的讲解，本文带大家较为详细的了解一下画笔的相关内容。  Paint 在英文中作为名词时主要含义是涂料，油漆，颜料的意思，作为动词则具有绘画、粉刷的意思，不过在程序相关的中文博客里面，Paint 通常被解释为画笔，本文也将采用这种翻译，因此本文里面提到的画笔如没有特殊表明就指代 Paint。0.引子通过本系列前面的文章知道，View 上的内容是通过 C...&hellip;</p>
          <div class="post-list__meta"><time datetime="2018-10-24 00:00:00 +0800" class="post-list__meta--date date">2018-10-24</time> &#8226; <span class="post-list__meta--tags tags">CustomView</span> <a class="btn-border-small" href=/customview/paint-base>继续阅读</a></div>
          <hr class="post-list__divider" />
          
      </li>
    
    
    
      <li>
          <!--正常文档-->
          
          <h2 class="post-list__post-title post-title"><a href="/gebug/bubble-sample" title="访问 雕虫晓技(十) Android超简单气泡效果">雕虫晓技(十) Android超简单气泡效果</a></h2>
          <p class="excerpt">【示例项目：BubbleSample】最近有用到水下气泡上升效果，因此在网上查了一下资料，结果还真找到了，就是这篇文章 [Android实例] 水下气泡上升界面效果, 不过这篇文章所附带的示例代码是有些问题的，例如View移除后，线程没有正确关闭，锁屏后再打开屏幕，气泡会挤成一团等问题，因此我在它的原理基础上稍为进行了一些调整和修改，解决了这些问题，它可以实现下面这样的效果：0. 基本原理气泡效果的基本原理非常简单，其实所谓的气泡就是一个个的半透明圆而已，它的基本逻辑如下：  如果当前圆的数量没有超过数量上限...&hellip;</p>
          <div class="post-list__meta"><time datetime="2018-09-09 00:00:00 +0800" class="post-list__meta--date date">2018-09-09</time> &#8226; <span class="post-list__meta--tags tags">GeBug</span> <a class="btn-border-small" href=/gebug/bubble-sample>继续阅读</a></div>
          <hr class="post-list__divider" />
          
      </li>
    
    
    
      <li>
          <!--正常文档-->
          
          <h2 class="post-list__post-title post-title"><a href="/tools/arc-seekbar" title="访问 ArcSeekBar(圆弧拖动条)">ArcSeekBar(圆弧拖动条)</a></h2>
          <p class="excerpt">GitHub项目地址: https://github.com/GcsSloop/arc-seekbar这个是在公司项目中准备使用的一个控件，本准备直接在网上搜一个用，可惜找到的很多都是 ProgressBar，并不具备拖拽功能，于是自己动手实现了一个，其功能和特性均仿照 SeekBar 进行设计。效果预览支持的特性  进度功能。  自定义属性配置。  线条宽度。  开口角度。  旋转角度。  渐变色。  最大进度值。  拖动按钮颜色、大小、样式(填充、描边、填充+描边)。  状态变化回调。主要文件      ...&hellip;</p>
          <div class="post-list__meta"><time datetime="2018-09-02 00:00:00 +0800" class="post-list__meta--date date">2018-09-02</time> &#8226; <span class="post-list__meta--tags tags">Tools</span> <a class="btn-border-small" href=/tools/arc-seekbar>继续阅读</a></div>
          <hr class="post-list__divider" />
          
      </li>
    
    
    
      <li>
          <!--正常文档-->
          
          <h2 class="post-list__post-title post-title"><a href="/gebug/netty-private-protocol" title="访问 雕虫晓技(九) Netty与私有协议框架">雕虫晓技(九) Netty与私有协议框架</a></h2>
          <p class="excerpt">关于作者GcsSloop，一名 2.5 次元魔法师。微博 | GitHub | 博客1.前言【本文示例源码下载】在本系列的前一篇，说了 Android 与数据流的斗争，主要是 Android 前端自身处理方案。这一篇则是涉及一些前后端方面的数据传输的问题。通常来说，Android 和服务端之间的数据传输都会采用标准协议规范，且大多数是基于 HTTP 协议的，例如在Android端最常用的 Retrofit，则是 RESTful 风格的一套网络框架。虽然这是我们最常用的框架之一，但是很多人对该框架了解并不是特别...&hellip;</p>
          <div class="post-list__meta"><time datetime="2018-09-01 00:00:00 +0800" class="post-list__meta--date date">2018-09-01</time> &#8226; <span class="post-list__meta--tags tags">GeBug</span> <a class="btn-border-small" href=/gebug/netty-private-protocol>继续阅读</a></div>
          <hr class="post-list__divider" />
          
      </li>
    
    
    
      <li>
          <!--正常文档-->
          
          <h2 class="post-list__post-title post-title"><a href="/gebug/android-stream" title="访问 雕虫晓技(八) Android与数据流的斗争">雕虫晓技(八) Android与数据流的斗争</a></h2>
          <p class="excerpt">关于作者GcsSloop，一名 2.5 次元魔法师。微博 | GitHub | 博客本文并没有什么实质性的内容，只是自己工作和学习这段时间的一些经验杂谈，仅从自己的角度阐述一下自己观察到的一些内容，可能并不全面，也不一定正确，仅供大家参考一下。目前 Android 开发，从广义上来说可以划为前端的一部分，毕竟大部分 Android 开发所做的工作就是从服务器获取数据，将这些数据用合适的方式展示给用户，再把用户操作产生的数据传递给服务器。在这样的情境下 Android 开发所需要解决的一个核心问题就是数据的传递...&hellip;</p>
          <div class="post-list__meta"><time datetime="2018-08-12 00:00:00 +0800" class="post-list__meta--date date">2018-08-12</time> &#8226; <span class="post-list__meta--tags tags">GeBug</span> <a class="btn-border-small" href=/gebug/android-stream>继续阅读</a></div>
          <hr class="post-list__divider" />
          
      </li>
    
    
    
      <li>
          <!--正常文档-->
          
          <h2 class="post-list__post-title post-title"><a href="/customview/scalegesturedetector" title="访问 安卓自定义View进阶-缩放手势检测(ScaleGestureDecetor)">安卓自定义View进阶-缩放手势检测(ScaleGestureDecetor)</a></h2>
          <p class="excerpt">0. 前言Android 缩放手势检测，ScaleGestureDetector 相关内容的用法和注意事项，本文依旧属于事件处理这一体系，在大多数的情况下，缩放手势都不是单独存在的，需要配合其它的手势来使用，所以推荐配合 手势检测(GestureDetector) 一起观看。如果是用在自定义的控件上，则需要配合 Matrix 相关内容使用起来可能会更加方便，如果对 Matrix 不太熟悉也可以看本系列文章之前的内容来补充一下相关知识。如果你没看过之前的文章，可以到 自定义 View 系列 来查看这些内容。缩放...&hellip;</p>
          <div class="post-list__meta"><time datetime="2018-08-09 00:00:00 +0800" class="post-list__meta--date date">2018-08-09</time> &#8226; <span class="post-list__meta--tags tags">CustomView</span> <a class="btn-border-small" href=/customview/scalegesturedetector>继续阅读</a></div>
          <hr class="post-list__divider" />
          
      </li>
    
    
    
      <li>
          <!--正常文档-->
          
          <h2 class="post-list__post-title post-title"><a href="/gebug/internet-ip-webcam" title="访问 雕虫晓技(七) 用旧Android手机做远程摄像头">雕虫晓技(七) 用旧Android手机做远程摄像头</a></h2>
          <p class="excerpt">关于作者GcsSloop，一名 2.5 次元魔法师。微博 | GitHub | 博客0. 前言科技发展越来越快，手机也换的越来越频繁，有很多旧手机都被淘汰了，这些旧手机一般没什么用，也不能卖，毕竟手机中可能还存在着一些私人数据可能没有清空，因此这些旧手机就只能放在家里落灰了。对于大多数人来说，这些旧手机都是无法被利用起来的，虽然网上有很多的利用旧手机的教程，但很多要么是很鸡肋，要么是操作难度较高，需要较强的动手能力。那么今天呢，就教大家如何低成本的快速将旧 Android 手机变成一个可远程访问的摄像头。本文...&hellip;</p>
          <div class="post-list__meta"><time datetime="2018-06-12 00:00:00 +0800" class="post-list__meta--date date">2018-06-12</time> &#8226; <span class="post-list__meta--tags tags">GeBug</span> <a class="btn-border-small" href=/gebug/internet-ip-webcam>继续阅读</a></div>
          <hr class="post-list__divider" />
          
      </li>
    
    
    
      <li>
          <!--正常文档-->
          
          <h2 class="post-list__post-title post-title"><a href="https://xiaozhuanlan.com/topic/1456397082" title="访问 雕虫晓技(六) 网格分页布局源码解析(下)" target="_blank">[专栏]雕虫晓技(六) 网格分页布局源码解析(下)</a></h2>
          <p class="excerpt">0. 前言pager-layoutmanager： https://github.com/GcsSloop/pager-layoutmanager在网格分页布局源码解析(上)中，主要分享了如何定义一个网格布局，正常运行的效果看起来其实和 GridLayoutManager 有些类似。这是它的下篇，主要讲解如何让它滑动时一页一页的滚动，而不是随意的滚动，除此之外，还包括一些其他相关内容，例如滚动、平滑滚动和超长距离滚动需要注意的一些细节。1. 分页对齐在开始讲解前，先看一下启用了分页对齐和未启用分页对齐的效果有...&hellip;</p>
          <div class="post-list__meta"><time datetime="2018-04-10 00:00:00 +0800" class="post-list__meta--date date">2018-04-10</time> &#8226; <span class="post-list__meta--tags tags">GeBug</span> <a class="btn-border-small" href=https://xiaozhuanlan.com/topic/1456397082 target="_blank">继续阅读</a></div>
          <hr class="post-list__divider" />
          
      </li>
    
    
    
      <li>
          <!--正常文档-->
          
          <h2 class="post-list__post-title post-title"><a href="https://xiaozhuanlan.com/topic/5841730926" title="访问 雕虫晓技(五) 网格分页布局源码解析(上)" target="_blank">[专栏]雕虫晓技(五) 网格分页布局源码解析(上)</a></h2>
          <p class="excerpt">关于作者GcsSloop，一名 2.5 次元魔法师。微博 | GitHub | 博客0.前言pager-layoutmanager： https://github.com/GcsSloop/pager-layoutmanager这个是我之前公开分享的一个开源库 【PagerLayoutManager(网格分页布局)】 的详细解析，在开始讲解之前，先看看它能实现的一些效果。 上面是它的应用场景之一，再看一下实现这种场景所需的代码：// 布局管理器PagerGridLayoutManager layoutMana...&hellip;</p>
          <div class="post-list__meta"><time datetime="2018-04-08 00:00:00 +0800" class="post-list__meta--date date">2018-04-08</time> &#8226; <span class="post-list__meta--tags tags">GeBug</span> <a class="btn-border-small" href=https://xiaozhuanlan.com/topic/5841730926 target="_blank">继续阅读</a></div>
          <hr class="post-list__divider" />
          
      </li>
    
    
    
      <li>
          <!--正常文档-->
          
          <h2 class="post-list__post-title post-title"><a href="/gebug/maven-private" title="访问 雕虫晓技(四) 搭建私有Maven仓库(带容灾备份)">雕虫晓技(四) 搭建私有Maven仓库(带容灾备份)</a></h2>
          <p class="excerpt">关于作者GcsSloop，一名 2.5 次元魔法师。微博 | GitHub | 博客0. 前言随着 Android 开发的发展，Android 开发也相对越来越简单，很多基础库只用简单的添加一行依赖就可以使用了，不用自己去手动添加，升级也只需要修改一下版本号，简单便捷。那么它是如何实现的呢？事实上，我们所依赖的这些文件，是存放在一些公开仓库中的，当我们添加这些依赖时，Gredle 会自动去仓库中查找是否存在，如果存在，就下载下来放到本地参与编译。我们最常用的一些公开库大部分是放在 jcenter 仓库中的，我...&hellip;</p>
          <div class="post-list__meta"><time datetime="2018-03-15 00:00:00 +0800" class="post-list__meta--date date">2018-03-15</time> &#8226; <span class="post-list__meta--tags tags">GeBug</span> <a class="btn-border-small" href=/gebug/maven-private>继续阅读</a></div>
          <hr class="post-list__divider" />
          
      </li>
    
    
  </ol>

  <hr class="post-list__divider " />

<nav class="pagination" role="navigation">
    
    <span class="pagination__page-number">1 / 6</span>
    
        <a class="older-posts pagination__older btn btn-small btn-tertiary" href="/page/2/#blog">更早 &rarr;</a>
    
</nav>


</div>


            <section class="footer">
    <footer>
    	<span class="footer__copyright">本站点采用<a rel="license" href="https://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh" target="_blank">知识共享 署名-非商业性使用-禁止演绎 4.0 国际 许可协议</a></span>
        <span class="footer__copyright">本站由 <a href="http://www.GcsSloop.com">@GcsSloop</a> 创建，采用 <a href="https://github.com/GcsSloop/Gcs-Vno-Jekyll" target="_blank">Gcs-Vno-Jekyll</a> 作为主题。<span id="busuanzi_container_site_pv"> 总访问量 <span id="busuanzi_value_site_pv"></span> 次</span> - &copy; 2019</span>
        <span class="footer__sitemap, footer__copyright"><a href="http://www.gcssloop.com/sitemap.xml" target="_blank">Site Map</a>
        <a href="http://www.gcssloop.com/vip" target="_blank">vip</a></span>
    </footer>
</section>

        </div>
    </div>
    
    <script type="text/javascript" src="//code.jquery.com/jquery-1.11.3.min.js"></script>

<script type="text/javascript" src="/js/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>

<script type="text/javascript" src="/js/main.js"></script>

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-82493667-1', 'auto');
  ga('send', 'pageview');

</script>

    
  </body>

</html>
